// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: https://codemirror.net/LICENSE


(function(mod) {
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"), require("../../addon/mode/simple"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror", "../../addon/mode/simple"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
// "use strict";

var builtins_base = [
  'if', 'else', 'in', 'foreach', 'for', 'forv', 'forva',
  'forval', 'forvalu', 'forvalue', 'forvalues', 'by', 'bys',
  'bysort', 'quietly', 'qui', 'about', 'ac',
  'ac_7', 'acprplot', 'acprplot_7', 'adjust', 'ado', 'adopath',
  'adoupdate', 'alpha', 'ameans', 'an', 'ano', 'anov', 'anova',
  'anova_estat', 'anova_terms', 'anovadef', 'aorder', 'ap', 'app',
  'appe', 'appen', 'append', 'arch', 'arch_dr', 'arch_estat',
  'arch_p', 'archlm', 'areg', 'areg_p', 'args', 'arima',
  'arima_dr', 'arima_estat', 'arima_p', 'as', 'asmprobit',
  'asmprobit_estat', 'asmprobit_lf', 'asmprobit_mfx__dlg',
  'asmprobit_p', 'ass', 'asse', 'asser', 'assert', 'avplot',
  'avplot_7', 'avplots', 'avplots_7', 'bcskew0', 'bgodfrey',
  'binreg', 'bip0_lf', 'biplot', 'bipp_lf', 'bipr_lf',
  'bipr_p', 'biprobit', 'bitest', 'bitesti', 'bitowt', 'blogit',
  'bmemsize', 'boot', 'bootsamp', 'bootstrap', 'bootstrap_8',
  'boxco_l', 'boxco_p', 'boxcox', 'boxcox_6', 'boxcox_p',
  'bprobit', 'br', 'break', 'brier', 'bro', 'brow', 'brows',
  'browse', 'brr', 'brrstat', 'bs', 'bs_7', 'bsampl_w',
  'bsample', 'bsample_7', 'bsqreg', 'bstat', 'bstat_7', 'bstat_8',
  'bstrap', 'bstrap_7', 'ca', 'ca_estat', 'ca_p', 'cabiplot',
  'camat', 'canon', 'canon_8', 'canon_8_p', 'canon_estat',
  'canon_p', 'cap', 'caprojection', 'capt', 'captu', 'captur',
  'capture', 'cat', 'cc', 'cchart', 'cchart_7', 'cci',
  'cd', 'censobs_table', 'centile', 'cf', 'char', 'chdir',
  'checkdlgfiles', 'checkestimationsample', 'checkhlpfiles',
  'checksum', 'chelp', 'ci', 'cii', 'cl', 'class', 'classutil',
  'clear', 'cli', 'clis', 'clist', 'clo', 'clog', 'clog_lf',
  'clog_p', 'clogi', 'clogi_sw', 'clogit', 'clogit_lf',
  'clogit_p', 'clogitp', 'clogl_sw', 'cloglog', 'clonevar',
  'clslistarray', 'cluster', 'cluster_measures', 'cluster_stop',
  'cluster_tree', 'cluster_tree_8', 'clustermat', 'cmdlog',
  'cnr', 'cnre', 'cnreg', 'cnreg_p', 'cnreg_sw', 'cnsreg',
  'codebook', 'collaps4', 'collapse', 'colormult_nb',
  'colormult_nw', 'compare', 'compress', 'conf', 'confi',
  'confir', 'confirm', 'conren', 'cons', 'const', 'constr',
  'constra', 'constrai', 'constrain', 'constraint', 'continue',
  'contract', 'copy', 'copyright', 'copysource', 'cor', 'corc',
  'corr', 'corr2data', 'corr_anti', 'corr_kmo', 'corr_smc',
  'corre', 'correl', 'correla', 'correlat', 'correlate',
  'corrgram', 'cou', 'coun', 'count', 'cox', 'cox_p', 'cox_sw',
  'coxbase', 'coxhaz', 'coxvar', 'cprplot', 'cprplot_7',
  'crc', 'cret', 'cretu', 'cretur', 'creturn', 'cross', 'cs',
  'cscript', 'cscript_log', 'csi', 'ct', 'ct_is', 'ctset',
  'ctst_5', 'ctst_st', 'cttost', 'cumsp', 'cumsp_7', 'cumul',
  'cusum', 'cusum_7', 'cutil', 'd', 'datasig', 'datasign',
  'datasigna', 'datasignat', 'datasignatu', 'datasignatur',
  'datasignature', 'datetof', 'db', 'dbeta', 'de', 'dec',
  'deco', 'decod', 'decode', 'deff', 'des', 'desc', 'descr',
  'descri', 'describ', 'describe', 'destring', 'dfbeta',
  'dfgls', 'dfuller', 'di', 'di_g', 'dir', 'dirstats', 'dis',
  'discard', 'disp', 'disp_res', 'disp_s', 'displ', 'displa',
  'display', 'distinct', 'do', 'doe', 'doed', 'doedi',
  'doedit', 'dotplot', 'dotplot_7', 'dprobit', 'drawnorm',
  'drop', 'ds', 'ds_util', 'dstdize', 'duplicates', 'durbina',
  'dwstat', 'dydx', 'e', 'ed', 'edi', 'edit', 'egen',
  'eivreg', 'emdef', 'en', 'enc', 'enco', 'encod', 'encode',
  'eq', 'erase', 'ereg', 'ereg_lf', 'ereg_p', 'ereg_sw',
  'ereghet', 'ereghet_glf', 'ereghet_glf_sh', 'ereghet_gp',
  'ereghet_ilf', 'ereghet_ilf_sh', 'ereghet_ip', 'eret',
  'eretu', 'eretur', 'ereturn', 'err', 'erro', 'error', 'est',
  'est_cfexist', 'est_cfname', 'est_clickable', 'est_expand',
  'est_hold', 'est_table', 'est_unhold', 'est_unholdok',
  'estat', 'estat_default', 'estat_summ', 'estat_vce_only',
  'esti', 'estimates', 'etodow', 'etof', 'etomdy', 'ex',
  'exi', 'exit', 'expand', 'expandcl', 'fac', 'fact', 'facto',
  'factor', 'factor_estat', 'factor_p', 'factor_pca_rotated',
  'factor_rotate', 'factormat', 'fcast', 'fcast_compute',
  'fcast_graph', 'fdades', 'fdadesc', 'fdadescr', 'fdadescri',
  'fdadescrib', 'fdadescribe', 'fdasav', 'fdasave', 'fdause',
  'fh_st', 'open', 'read', 'close',
  'file', 'filefilter', 'fillin', 'find_hlp_file', 'findfile',
  'findit', 'findit_7', 'fit', 'fl', 'fli', 'flis', 'flist',
  'for5_0', 'form', 'forma', 'format', 'fpredict', 'frac_154',
  'frac_adj', 'frac_chk', 'frac_cox', 'frac_ddp', 'frac_dis',
  'frac_dv', 'frac_in', 'frac_mun', 'frac_pp', 'frac_pq',
  'frac_pv', 'frac_wgt', 'frac_xo', 'fracgen', 'fracplot',
  'fracplot_7', 'fracpoly', 'fracpred', 'fron_ex', 'fron_hn',
  'fron_p', 'fron_tn', 'fron_tn2', 'frontier', 'ftodate', 'ftoe',
  'ftomdy', 'ftowdate', 'g', 'gamhet_glf', 'gamhet_gp',
  'gamhet_ilf', 'gamhet_ip', 'gamma', 'gamma_d2', 'gamma_p',
  'gamma_sw', 'gammahet', 'gdi_hexagon', 'gdi_spokes', 'ge',
  'gen', 'gene', 'gener', 'genera', 'generat', 'generate',
  'genrank', 'genstd', 'genvmean', 'gettoken', 'gl', 'gladder',
  'gladder_7', 'glim_l01', 'glim_l02', 'glim_l03', 'glim_l04',
  'glim_l05', 'glim_l06', 'glim_l07', 'glim_l08', 'glim_l09',
  'glim_l10', 'glim_l11', 'glim_l12', 'glim_lf', 'glim_mu',
  'glim_nw1', 'glim_nw2', 'glim_nw3', 'glim_p', 'glim_v1',
  'glim_v2', 'glim_v3', 'glim_v4', 'glim_v5', 'glim_v6',
  'glim_v7', 'glm', 'glm_6', 'glm_p', 'glm_sw', 'glmpred', 'glo',
  'glob', 'globa', 'global', 'glogit', 'glogit_8', 'glogit_p',
  'gmeans', 'gnbre_lf', 'gnbreg', 'gnbreg_5', 'gnbreg_p',
  'gomp_lf', 'gompe_sw', 'gomper_p', 'gompertz', 'gompertzhet',
  'gomphet_glf', 'gomphet_glf_sh', 'gomphet_gp', 'gomphet_ilf',
  'gomphet_ilf_sh', 'gomphet_ip', 'gphdot', 'gphpen',
  'gphprint', 'gprefs', 'gprobi_p', 'gprobit', 'gprobit_8', 'gr',
  'gr7', 'gr_copy', 'gr_current', 'gr_db', 'gr_describe',
  'gr_dir', 'gr_draw', 'gr_draw_replay', 'gr_drop', 'gr_edit',
  'gr_editviewopts', 'gr_example', 'gr_example2', 'gr_export',
  'gr_print', 'gr_qscheme', 'gr_query', 'gr_read', 'gr_rename',
  'gr_replay', 'gr_save', 'gr_set', 'gr_setscheme', 'gr_table',
  'gr_undo', 'gr_use', 'graph', 'graph7', 'grebar', 'greigen',
  'greigen_7', 'greigen_8', 'grmeanby', 'grmeanby_7',
  'gs_fileinfo', 'gs_filetype', 'gs_graphinfo', 'gs_stat',
  'gsort', 'gwood', 'h', 'hadimvo', 'hareg', 'hausman',
  'haver', 'he', 'heck_d2', 'heckma_p', 'heckman', 'heckp_lf',
  'heckpr_p', 'heckprob', 'hel', 'help', 'hereg', 'hetpr_lf',
  'hetpr_p', 'hetprob', 'hettest', 'hexdump', 'hilite',
  'hist', 'hist_7', 'histogram', 'hlogit', 'hlu', 'hmeans',
  'hotel', 'hotelling', 'hprobit', 'hreg', 'hsearch', 'icd9',
  'icd9_ff', 'icd9p', 'iis', 'impute', 'imtest', 'inbase',
  'include', 'inf', 'infi', 'infil', 'infile', 'infix', 'inp',
  'inpu', 'input', 'ins', 'insheet', 'insp', 'inspe',
  'inspec', 'inspect', 'integ', 'inten', 'intreg', 'intreg_7',
  'intreg_p', 'intrg2_ll', 'intrg_ll', 'intrg_ll2', 'ipolate',
  'iqreg', 'ir', 'irf', 'irf_create', 'irfm', 'iri', 'is_svy',
  'is_svysum', 'isid', 'istdize', 'ivprob_1_lf', 'ivprob_lf',
  'ivprobit', 'ivprobit_p', 'ivreg', 'ivreg_footnote',
  'ivtob_1_lf', 'ivtob_lf', 'ivtobit', 'ivtobit_p', 'jackknife',
  'jacknife', 'jknife', 'jknife_6', 'jknife_8', 'jkstat',
  'joinby', 'kalarma1', 'kap', 'kap_3', 'kapmeier', 'kappa',
  'kapwgt', 'kdensity', 'kdensity_7', 'keep', 'ksm', 'ksmirnov',
  'ktau', 'kwallis', 'l', 'la', 'lab', 'labe', 'label',
  'labelbook', 'ladder', 'levels', 'levelsof', 'leverage',
  'lfit', 'lfit_p', 'li', 'lincom', 'line', 'linktest',
  'lis', 'list', 'lloghet_glf', 'lloghet_glf_sh', 'lloghet_gp',
  'lloghet_ilf', 'lloghet_ilf_sh', 'lloghet_ip', 'llogi_sw',
  'llogis_p', 'llogist', 'llogistic', 'llogistichet',
  'lnorm_lf', 'lnorm_sw', 'lnorma_p', 'lnormal', 'lnormalhet',
  'lnormhet_glf', 'lnormhet_glf_sh', 'lnormhet_gp',
  'lnormhet_ilf', 'lnormhet_ilf_sh', 'lnormhet_ip', 'lnskew0',
  'loadingplot', 'loc', 'loca', 'local', 'log', 'logi',
  'logis_lf', 'logistic', 'logistic_p', 'logit', 'logit_estat',
  'logit_p', 'loglogs', 'logrank', 'loneway', 'lookfor',
  'lookup', 'lowess', 'lowess_7', 'lpredict', 'lrecomp', 'lroc',
  'lroc_7', 'lrtest', 'ls', 'lsens', 'lsens_7', 'lsens_x',
  'lstat', 'ltable', 'ltable_7', 'ltriang', 'lv', 'lvr2plot',
  'lvr2plot_7', 'm', 'ma', 'mac', 'macr', 'macro', 'makecns',
  'man', 'manova', 'manova_estat', 'manova_p', 'manovatest',
  'mantel', 'mark', 'markin', 'markout', 'marksample', 'mat',
  'mat_capp', 'mat_order', 'mat_put_rr', 'mat_rapp', 'mata',
  'mata_clear', 'mata_describe', 'mata_drop', 'mata_matdescribe',
  'mata_matsave', 'mata_matuse', 'mata_memory', 'mata_mlib',
  'mata_mosave', 'mata_rename', 'mata_which', 'matalabel',
  'matcproc', 'matlist', 'matname', 'matr', 'matri',
  'matrix', 'matrix_input__dlg', 'matstrik', 'mcc', 'mcci',
  'md0_', 'md1_', 'md1debug_', 'md2_', 'md2debug_', 'mds',
  'mds_estat', 'mds_p', 'mdsconfig', 'mdslong', 'mdsmat',
  'mdsshepard', 'mdytoe', 'mdytof', 'me_derd', 'mean',
  'means', 'median', 'memory', 'memsize', 'meqparse', 'mer',
  'merg', 'merge', 'mfp', 'mfx', 'mhelp', 'mhodds', 'minbound',
  'mixed_ll', 'mixed_ll_reparm', 'mkassert', 'mkdir',
  'mkmat', 'mkspline', 'ml', 'ml_5', 'ml_adjs', 'ml_bhhhs',
  'ml_c_d', 'ml_check', 'ml_clear', 'ml_cnt', 'ml_debug',
  'ml_defd', 'ml_e0', 'ml_e0_bfgs', 'ml_e0_cycle', 'ml_e0_dfp',
  'ml_e0i', 'ml_e1', 'ml_e1_bfgs', 'ml_e1_bhhh', 'ml_e1_cycle',
  'ml_e1_dfp', 'ml_e2', 'ml_e2_cycle', 'ml_ebfg0', 'ml_ebfr0',
  'ml_ebfr1', 'ml_ebh0q', 'ml_ebhh0', 'ml_ebhr0', 'ml_ebr0i',
  'ml_ecr0i', 'ml_edfp0', 'ml_edfr0', 'ml_edfr1', 'ml_edr0i',
  'ml_eds', 'ml_eer0i', 'ml_egr0i', 'ml_elf', 'ml_elf_bfgs',
  'ml_elf_bhhh', 'ml_elf_cycle', 'ml_elf_dfp', 'ml_elfi',
  'ml_elfs', 'ml_enr0i', 'ml_enrr0', 'ml_erdu0', 'ml_erdu0_bfgs',
  'ml_erdu0_bhhh', 'ml_erdu0_bhhhq', 'ml_erdu0_cycle',
  'ml_erdu0_dfp', 'ml_erdu0_nrbfgs', 'ml_exde', 'ml_footnote',
  'ml_geqnr', 'ml_grad0', 'ml_graph', 'ml_hbhhh', 'ml_hd0',
  'ml_hold', 'ml_init', 'ml_inv', 'ml_log', 'ml_max',
  'ml_mlout', 'ml_mlout_8', 'ml_model', 'ml_nb0', 'ml_opt',
  'ml_p', 'ml_plot', 'ml_query', 'ml_rdgrd', 'ml_repor',
  'ml_s_e', 'ml_score', 'ml_searc', 'ml_technique', 'ml_unhold',
  'mleval', 'mlf_', 'mlmatbysum', 'mlmatsum', 'mlog', 'mlogi',
  'mlogit', 'mlogit_footnote', 'mlogit_p', 'mlopts', 'mlsum',
  'mlvecsum', 'mnl0_', 'mor', 'more', 'mov', 'move', 'mprobit',
  'mprobit_lf', 'mprobit_p', 'mrdu0_', 'mrdu1_', 'mvdecode',
  'mvencode', 'mvreg', 'mvreg_estat', 'n', 'nbreg',
  'nbreg_al', 'nbreg_lf', 'nbreg_p', 'nbreg_sw', 'nestreg', 'net',
  'newey', 'newey_7', 'newey_p', 'news', 'nl', 'nl_7', 'nl_9',
  'nl_9_p', 'nl_p', 'nl_p_7', 'nlcom', 'nlcom_p', 'nlexp2',
  'nlexp2_7', 'nlexp2a', 'nlexp2a_7', 'nlexp3', 'nlexp3_7',
  'nlgom3', 'nlgom3_7', 'nlgom4', 'nlgom4_7', 'nlinit', 'nllog3',
  'nllog3_7', 'nllog4', 'nllog4_7', 'nlog_rd', 'nlogit',
  'nlogit_p', 'nlogitgen', 'nlogittree', 'nlpred', 'no',
  'nobreak', 'noi', 'nois', 'noisi', 'noisil', 'noisily', 'note',
  'notes', 'notes_dlg', 'nptrend', 'numlabel', 'numlist', 'odbc',
  'old_ver', 'olo', 'olog', 'ologi', 'ologi_sw', 'ologit',
  'ologit_p', 'ologitp', 'on', 'one', 'onew', 'onewa', 'oneway',
  'op_colnm', 'op_comp', 'op_diff', 'op_inv', 'op_str', 'opr',
  'opro', 'oprob', 'oprob_sw', 'oprobi', 'oprobi_p', 'oprobit',
  'oprobitp', 'opts_exclusive', 'order', 'orthog', 'orthpoly',
  'ou', 'out', 'outf', 'outfi', 'outfil', 'outfile', 'outs',
  'outsh', 'outshe', 'outshee', 'outsheet', 'ovtest', 'pac',
  'pac_7', 'palette', 'parse', 'parse_dissim', 'pause', 'pca',
  'pca_8', 'pca_display', 'pca_estat', 'pca_p', 'pca_rotate',
  'pcamat', 'pchart', 'pchart_7', 'pchi', 'pchi_7', 'pcorr',
  'pctile', 'pentium', 'pergram', 'pergram_7', 'permute',
  'permute_8', 'personal', 'peto_st', 'pkcollapse', 'pkcross',
  'pkequiv', 'pkexamine', 'pkexamine_7', 'pkshape', 'pksumm',
  'pksumm_7', 'pl', 'plo', 'plot', 'plugin', 'pnorm',
  'pnorm_7', 'poisgof', 'poiss_lf', 'poiss_sw', 'poisso_p',
  'poisson', 'poisson_estat', 'post', 'postclose', 'postfile',
  'postutil', 'pperron', 'pr', 'prais', 'prais_e', 'prais_e2',
  'prais_p', 'predict', 'predictnl', 'preserve', 'print',
  'pro', 'prob', 'probi', 'probit', 'probit_estat', 'probit_p',
  'proc_time', 'procoverlay', 'procrustes', 'procrustes_estat',
  'procrustes_p', 'profiler', 'prog', 'progr', 'progra',
  'program', 'prop', 'proportion', 'prtest', 'prtesti', 'pwcorr',
  'pwd', 'q', 's', 'qby', 'qbys', 'qchi', 'qchi_7', 'qladder',
  'qladder_7', 'qnorm', 'qnorm_7', 'qqplot', 'qqplot_7', 'qreg',
  'qreg_c', 'qreg_p', 'qreg_sw', 'qu', 'quadchk', 'quantile',
  'quantile_7', 'que', 'quer', 'query', 'range', 'ranksum',
  'ratio', 'rchart', 'rchart_7', 'rcof', 'recast', 'reclink',
  'recode', 'reg', 'reg3', 'reg3_p', 'regdw', 'regr', 'regre',
  'regre_p2', 'regres', 'regres_p', 'regress', 'regress_estat',
  'regriv_p', 'remap', 'ren', 'rena', 'renam', 'rename',
  'renpfix', 'repeat', 'replace', 'report', 'reshape',
  'restore', 'ret', 'retu', 'retur', 'return', 'rm', 'rmdir',
  'robvar', 'roccomp', 'roccomp_7', 'roccomp_8', 'rocf_lf',
  'rocfit', 'rocfit_8', 'rocgold', 'rocplot', 'rocplot_7',
  'roctab', 'roctab_7', 'rolling', 'rologit', 'rologit_p',
  'rot', 'rota', 'rotat', 'rotate', 'rotatemat', 'rreg',
  'rreg_p', 'ru', 'run', 'runtest', 'rvfplot', 'rvfplot_7',
  'rvpplot', 'rvpplot_7', 'sa', 'safesum', 'sample',
  'sampsi', 'sav', 'save', 'savedresults', 'saveold', 'sc',
  'sca', 'scal', 'scala', 'scalar', 'scatter', 'scm_mine',
  'sco', 'scob_lf', 'scob_p', 'scobi_sw', 'scobit', 'scor',
  'score', 'scoreplot', 'scoreplot_help', 'scree', 'screeplot',
  'screeplot_help', 'sdtest', 'sdtesti', 'se', 'search',
  'separate', 'seperate', 'serrbar', 'serrbar_7', 'serset', 'set',
  'set_defaults', 'sfrancia', 'sh', 'she', 'shel', 'shell',
  'shewhart', 'shewhart_7', 'signestimationsample', 'signrank',
  'signtest', 'simul', 'simul_7', 'simulate', 'simulate_8',
  'sktest', 'sleep', 'slogit', 'slogit_d2', 'slogit_p', 'smooth',
  'snapspan', 'so', 'sor', 'sort', 'spearman', 'spikeplot',
  'spikeplot_7', 'spikeplt', 'spline_x', 'split', 'sqreg',
  'sqreg_p', 'sret', 'sretu', 'sretur', 'sreturn', 'ssc', 'st',
  'st_ct', 'st_hc', 'st_hcd', 'st_hcd_sh', 'st_is', 'st_issys',
  'st_note', 'st_promo', 'st_set', 'st_show', 'st_smpl',
  'st_subid', 'stack', 'statsby', 'statsby_8', 'stbase', 'stci',
  'stci_7', 'stcox', 'stcox_estat', 'stcox_fr', 'stcox_fr_ll',
  'stcox_p', 'stcox_sw', 'stcoxkm', 'stcoxkm_7', 'stcstat',
  'stcurv', 'stcurve', 'stcurve_7', 'stdes', 'stem', 'stepwise',
  'stereg', 'stfill', 'stgen', 'stir', 'stjoin', 'stmc', 'stmh',
  'stphplot', 'stphplot_7', 'stphtest', 'stphtest_7',
  'stptime', 'strate', 'strate_7', 'streg', 'streg_sw', 'streset',
  'sts', 'sts_7', 'stset', 'stsplit', 'stsum', 'sttocc',
  'sttoct', 'stvary', 'stweib', 'su', 'suest', 'suest_8',
  'sum', 'summ', 'summa', 'summar', 'summari', 'summariz',
  'summarize', 'sunflower', 'sureg', 'survcurv', 'survsum',
  'svar', 'svar_p', 'svmat', 'svy', 'svy_disp', 'svy_dreg',
  'svy_est', 'svy_est_7', 'svy_estat', 'svy_get', 'svy_gnbreg_p',
  'svy_head', 'svy_header', 'svy_heckman_p', 'svy_heckprob_p',
  'svy_intreg_p', 'svy_ivreg_p', 'svy_logistic_p', 'svy_logit_p',
  'svy_mlogit_p', 'svy_nbreg_p', 'svy_ologit_p', 'svy_oprobit_p',
  'svy_poisson_p', 'svy_probit_p', 'svy_regress_p', 'svy_sub',
  'svy_sub_7', 'svy_x', 'svy_x_7', 'svy_x_p', 'svydes',
  'svydes_8', 'svygen', 'svygnbreg', 'svyheckman', 'svyheckprob',
  'svyintreg', 'svyintreg_7', 'svyintrg', 'svyivreg', 'svylc',
  'svylog_p', 'svylogit', 'svymarkout', 'svymarkout_8',
  'svymean', 'svymlog', 'svymlogit', 'svynbreg', 'svyolog',
  'svyologit', 'svyoprob', 'svyoprobit', 'svyopts',
  'svypois', 'svypois_7', 'svypoisson', 'svyprobit', 'svyprobt',
  'svyprop', 'svyprop_7', 'svyratio', 'svyreg', 'svyreg_p',
  'svyregress', 'svyset', 'svyset_7', 'svyset_8', 'svytab',
  'svytab_7', 'svytest', 'svytotal', 'sw', 'sw_8', 'swcnreg',
  'swcox', 'swereg', 'swilk', 'swlogis', 'swlogit',
  'swologit', 'swoprbt', 'swpois', 'swprobit', 'swqreg',
  'swtobit', 'swweib', 'symmetry', 'symmi', 'symplot',
  'symplot_7', 'syntax', 'sysdescribe', 'sysdir', 'sysuse',
  'szroeter', 'ta', 'tab', 'tab1', 'tab2', 'tab_or', 'tabd',
  'tabdi', 'tabdis', 'tabdisp', 'tabi', 'table', 'tabodds',
  'tabodds_7', 'tabstat', 'tabu', 'tabul', 'tabula', 'tabulat',
  'tabulate', 'te', 'tempfile', 'tempname', 'tempvar', 'tes',
  'test', 'testnl', 'testparm', 'teststd', 'tetrachoric',
  'time_it', 'timer', 'tis', 'tob', 'tobi', 'tobit', 'tobit_p',
  'tobit_sw', 'token', 'tokeni', 'tokeniz', 'tokenize',
  'tostring', 'total', 'translate', 'translator', 'transmap',
  'treat_ll', 'treatr_p', 'treatreg', 'trim', 'trnb_cons',
  'trnb_mean', 'trpoiss_d2', 'trunc_ll', 'truncr_p', 'truncreg',
  'tsappend', 'tset', 'tsfill', 'tsline', 'tsline_ex',
  'tsreport', 'tsrevar', 'tsrline', 'tsset', 'tssmooth',
  'tsunab', 'ttest', 'ttesti', 'tut_chk', 'tut_wait', 'tutorial',
  'tw', 'tware_st', 'two', 'twoway', 'twoway__fpfit_serset',
  'twoway__function_gen', 'twoway__histogram_gen',
  'twoway__ipoint_serset', 'twoway__ipoints_serset',
  'twoway__kdensity_gen', 'twoway__lfit_serset',
  'twoway__normgen_gen', 'twoway__pci_serset',
  'twoway__qfit_serset', 'twoway__scatteri_serset',
  'twoway__sunflower_gen', 'twoway_ksm_serset', 'ty', 'typ',
  'type', 'typeof', 'u', 'unab', 'unabbrev', 'unabcmd',
  'update', 'us', 'use', 'uselabel', 'var', 'var_mkcompanion',
  'var_p', 'varbasic', 'varfcast', 'vargranger', 'varirf',
  'varirf_add', 'varirf_cgraph', 'varirf_create', 'varirf_ctable',
  'varirf_describe', 'varirf_dir', 'varirf_drop', 'varirf_erase',
  'varirf_graph', 'varirf_ograph', 'varirf_rename', 'varirf_set',
  'varirf_table', 'varlist', 'varlmar', 'varnorm', 'varsoc',
  'varstable', 'varstable_w', 'varstable_w2', 'varwle',
  'vce', 'vec', 'vec_fevd', 'vec_mkphi', 'vec_p', 'vec_p_w',
  'vecirf_create', 'veclmar', 'veclmar_w', 'vecnorm',
  'vecnorm_w', 'vecrank', 'vecstable', 'verinst', 'vers',
  'versi', 'versio', 'version', 'view', 'viewsource', 'vif',
  'vwls', 'wdatetof', 'webdescribe', 'webseek', 'webuse',
  'weib1_lf', 'weib2_lf', 'weib_lf', 'weib_lf0', 'weibhet_glf',
  'weibhet_glf_sh', 'weibhet_glfa', 'weibhet_glfa_sh',
  'weibhet_gp', 'weibhet_ilf', 'weibhet_ilf_sh', 'weibhet_ilfa',
  'weibhet_ilfa_sh', 'weibhet_ip', 'weibu_sw', 'weibul_p',
  'weibull', 'weibull_c', 'weibull_s', 'weibullhet',
  'wh', 'whelp', 'whi', 'which', 'whil', 'while', 'wilc_st',
  'wilcoxon', 'win', 'wind', 'windo', 'window', 'winexec',
  'wntestb', 'wntestb_7', 'wntestq', 'xchart', 'xchart_7',
  'xcorr', 'xcorr_7', 'xi', 'xi_6', 'xmlsav', 'xmlsave',
  'xmluse', 'xpose', 'xsh', 'xshe', 'xshel', 'xshell',
  'xt_iis', 'xt_tis', 'xtab_p', 'xtabond', 'xtbin_p',
  'xtclog', 'xtcloglog', 'xtcloglog_8', 'xtcloglog_d2',
  'xtcloglog_pa_p', 'xtcloglog_re_p', 'xtcnt_p', 'xtcorr',
  'xtdata', 'xtdes', 'xtfront_p', 'xtfrontier', 'xtgee',
  'xtgee_elink', 'xtgee_estat', 'xtgee_makeivar', 'xtgee_p',
  'xtgee_plink', 'xtgls', 'xtgls_p', 'xthaus', 'xthausman',
  'xtht_p', 'xthtaylor', 'xtile', 'xtint_p', 'xtintreg',
  'xtintreg_8', 'xtintreg_d2', 'xtintreg_p', 'xtivp_1',
  'xtivp_2', 'xtivreg', 'xtline', 'xtline_ex', 'xtlogit',
  'xtlogit_8', 'xtlogit_d2', 'xtlogit_fe_p', 'xtlogit_pa_p',
  'xtlogit_re_p', 'xtmixed', 'xtmixed_estat', 'xtmixed_p',
  'xtnb_fe', 'xtnb_lf', 'xtnbreg', 'xtnbreg_pa_p',
  'xtnbreg_refe_p', 'xtpcse', 'xtpcse_p', 'xtpois', 'xtpoisson',
  'xtpoisson_d2', 'xtpoisson_pa_p', 'xtpoisson_refe_p', 'xtpred',
  'xtprobit', 'xtprobit_8', 'xtprobit_d2', 'xtprobit_re_p',
  'xtps_fe', 'xtps_lf', 'xtps_ren', 'xtps_ren_8', 'xtrar_p',
  'xtrc', 'xtrc_p', 'xtrchh', 'xtrefe_p', 'xtreg', 'xtreg_be',
  'xtreg_fe', 'xtreg_ml', 'xtreg_pa_p', 'xtreg_re',
  'xtregar', 'xtrere_p', 'xtset', 'xtsf_ll', 'xtsf_llti',
  'xtsum', 'xttab', 'xttest0', 'xttobit', 'xttobit_8',
  'xttobit_p', 'xttrans', 'yx', 'yxview__barlike_draw',
  'yxview_area_draw', 'yxview_bar_draw', 'yxview_dot_draw',
  'yxview_dropline_draw', 'yxview_function_draw',
  'yxview_iarrow_draw', 'yxview_ilabels_draw',
  'yxview_normal_draw', 'yxview_pcarrow_draw',
  'yxview_pcbarrow_draw', 'yxview_pccapsym_draw',
  'yxview_pcscatter_draw', 'yxview_pcspike_draw',
  'yxview_rarea_draw', 'yxview_rbar_draw', 'yxview_rbarm_draw',
  'yxview_rcap_draw', 'yxview_rcapsym_draw',
  'yxview_rconnected_draw', 'yxview_rline_draw',
  'yxview_rscatter_draw', 'yxview_rspike_draw',
  'yxview_spike_draw', 'yxview_sunflower_draw', 'zap_s', 'zinb',
  'zinb_llf', 'zinb_plf', 'zip', 'zip_llf', 'zip_p', 'zip_plf',
  'zt_ct_5', 'zt_hc_5', 'zt_hcd_5', 'zt_is_5', 'zt_iss_5',
  'zt_sho_5', 'zt_smp_5', 'ztbase_5', 'ztcox_5', 'ztdes_5',
  'ztereg_5', 'ztfill_5', 'ztgen_5', 'ztir_5', 'ztjoin_5', 'ztnb',
  'ztnb_p', 'ztp', 'ztp_p', 'zts_5', 'ztset_5', 'ztspli_5',
  'ztsum_5', 'zttoct_5', 'ztvary_5', 'ztweib_5'];
var builtins_str = '(' + builtins_base.join('|') + ')\\b';

var builtins_functions = [
    'Cdhms', 'Chms', 'Clock', 'Cmdyhms', 'Cofc', 'Cofd', 'F',
    'Fden', 'Ftail', 'I', 'J', '_caller', 'abbrev', 'abs', 'acos',
    'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh',
    'autocode', 'betaden', 'binomial', 'binomialp', 'binomialtail',
    'binormal', 'bofd', 'byteorder', 'c', 'ceil', 'char',
    'chi2', 'chi2den', 'chi2tail', 'cholesky', 'chop', 'clip',
    'clock', 'cloglog', 'cofC', 'cofd', 'colnumb', 'colsof', 'comb',
    'cond', 'corr', 'cos', 'cosh', 'd', 'daily', 'date', 'day',
    'det', 'dgammapda', 'dgammapdada', 'dgammapdadx', 'dgammapdx',
    'dgammapdxdx', 'dhms', 'diag', 'diag0cnt', 'digamma',
    'dofC', 'dofb', 'dofc', 'dofh', 'dofm', 'dofq', 'dofw',
    'dofy', 'dow', 'doy', 'dunnettprob', 'e', 'el', 'epsdouble',
    'epsfloat', 'exp', 'fileexists', 'fileread', 'filereaderror',
    'filewrite', 'float', 'floor', 'fmtwidth', 'gammaden',
    'gammap', 'gammaptail', 'get', 'group', 'h', 'hadamard',
    'halfyear', 'halfyearly', 'has_eprop', 'hh', 'hhC', 'hms',
    'hofd', 'hours', 'hypergeometric', 'hypergeometricp', 'ibeta',
    'ibetatail', 'index', 'indexnot', 'inlist', 'inrange', 'int',
    'inv', 'invF', 'invFtail', 'invbinomial', 'invbinomialtail',
    'invchi2', 'invchi2tail', 'invcloglog', 'invdunnettprob',
    'invgammap', 'invgammaptail', 'invibeta', 'invibetatail',
    'invlogit', 'invnFtail', 'invnbinomial', 'invnbinomialtail',
    'invnchi2', 'invnchi2tail', 'invnibeta', 'invnorm', 'invnormal',
    'invnttail', 'invpoisson', 'invpoissontail', 'invsym', 'invt',
    'invttail', 'invtukeyprob', 'irecode', 'issym', 'issymmetric',
    'itrim', 'length', 'ln', 'lnfact', 'lnfactorial', 'lngamma',
    'lnnormal', 'lnnormalden', 'log', 'log10', 'logit', 'lower',
    'ltrim', 'm', 'match', 'matmissing', 'matrix', 'matuniform',
    'max', 'maxbyte', 'maxdouble', 'maxfloat', 'maxint', 'maxlong',
    'mdy', 'mdyhms', 'mi', 'min', 'minbyte', 'mindouble',
    'minfloat', 'minint', 'minlong', 'minutes', 'missing', 'mm',
    'mmC', 'mod', 'mofd', 'month', 'monthly', 'mreldif',
    'msofhours', 'msofminutes', 'msofseconds', 'nF', 'nFden',
    'nFtail', 'nbetaden', 'nbinomial', 'nbinomialp', 'nbinomialtail',
    'nchi2', 'nchi2den', 'nchi2tail', 'nibeta', 'norm', 'normal',
    'normalden', 'normd', 'npnF', 'npnchi2', 'npnt', 'nt', 'ntden',
    'nttail', 'nullmat', 'plural', 'poisson', 'poissonp',
    'poissontail', 'proper', 'q', 'qofd', 'quarter', 'quarterly',
    'r', 'rbeta', 'rbinomial', 'rchi2', 'real', 'recode', 'regexm',
    'regexr', 'regexs', 'reldif', 'replay', 'return', 'reverse',
    'rgamma', 'rhypergeometric', 'rnbinomial', 'rnormal', 'round',
    'rownumb', 'rowsof', 'rpoisson', 'rt', 'rtrim', 'runiform', 's',
    'scalar', 'seconds', 'sign', 'sin', 'sinh', 'smallestdouble',
    'soundex', 'soundex_nara', 'sqrt', 'ss', 'ssC', 'strcat',
    'strdup', 'string', 'strlen', 'strlower', 'strltrim', 'strmatch',
    'strofreal', 'strpos', 'strproper', 'strreverse', 'strrtrim',
    'strtoname', 'strtrim', 'strupper', 'subinstr', 'subinword',
    'substr', 'sum', 'sweep', 'syminv', 't', 'tC', 'tan', 'tanh',
    'tc', 'td', 'tden', 'th', 'tin', 'tm', 'tq', 'trace',
    'trigamma', 'trim', 'trunc', 'ttail', 'tukeyprob', 'tw',
    'twithin', 'uniform', 'upper', 'vec', 'vecdiag', 'w', 'week',
    'weekly', 'wofd', 'word', 'wordcount', 'year', 'yearly',
    'yh', 'ym', 'yofd', 'yq', 'yw'];
var builtins_fun_str = '(' + builtins_functions.join('|') + ')(?=\\()';

CodeMirror.defineSimpleMode("stata",{
  // The start state contains the rules that are intially used
  start: [
    // Comments
    {regex: /\/\/\/?.*$/, token: 'comment', sol: true},
    {regex: /(\s)\/\/\/?.*$/, token: 'comment'},
    {regex: /\s*\*.*$/, token: 'comment', sol: true},
    {regex: /\/\*/, token: 'comment', push: 'comments_block'},

    // Strings
    {regex: /"/, token: 'string', push: 'string_regular'},
    {regex: /`"/, token: 'string', push: 'string_compound'},

    // Macros
    {regex: /`/, token: 'variable-2', push: 'macro_local'},
    {regex: /\$/, token: 'variable-2', push: 'macro_global'},

    // Decimal Numbers
    {regex: /\b[+-]?(?:[0-9]+(?:\.[0-9]+)?|\.[0-9]+|\.)(?:[eE][+-]?[0-9]+)?[i]?\b/,
      token: 'number'},

    // Keywords
    // There are two separate dictionaries because the `\b` at the beginning of the regex seemed not to work. So instead, I either match the preceding space before the keyword or require the keyword to be at beginning of the string. I think this necessitates two different strings.
    {regex: new RegExp('\\s' + builtins_str), token: 'keyword'},
    {regex: new RegExp(builtins_str), token: 'keyword', sol: true},

    {regex: new RegExp('\\s' + builtins_fun_str), token: 'def'},
    {regex: /\s\w+(?=\()/, token: 'def'},

    {regex: /[\{]/, indent: true},
    {regex: /[\}]/, dedent: true},

    {regex: /-|==|<=|>=|<|>|&|!=/, token: 'operator'},
    {regex: /\*|\+|\^|\/|!|~|=|~=/, token: 'operator'},
  ],
  comments_block: [
    {regex: /\/\*/, token: 'comment', push: 'comments_block'},
    // this ends and restarts a comment block. but need to catch this so
    // that it doesn\'t start _another_ level of comment blocks
    {regex: /\*\/\*/, token: 'comment'},
    {regex: /(\*\/\s+\*(?!\/)[^\n]*)|(\*\/)/, token: 'comment', pop: true},
    // Match anything else as a character inside the comment
    {regex: /./, token: 'comment'},
  ],

  string_compound: [
    {regex: /`"/, token: 'string', push: 'string_compound'},
    {regex: /"'/, token: 'string', pop: true},
    {regex: /`/, token: 'variable-2', push: 'macro_local'},
    {regex: /\$/, token: 'variable-2', push: 'macro_global'},
    {regex: /./, token: 'string'}
  ],
  string_regular: [
    {regex: /"/, token: 'string', pop: true},
    {regex: /`/, token: 'variable-2', push: 'macro_local'},
    {regex: /\$/, token: 'variable-2', push: 'macro_global'},
    {regex: /./, token: 'string'}
  ],
  macro_local: [
    {regex: /`/, token: 'variable-2', push: 'macro_local'},
    {regex: /'/, token: 'variable-2', pop: true},
    {regex: /./, token: 'variable-2'},
  ],
  macro_global: [
    {regex: /\}/, token: 'variable-2', pop: true},
    {regex: /.(?=[^\w\{\}])/, token: 'variable-2', pop: true},
    {regex: /./, token: 'variable-2'},
  ],
  meta: {
    closeBrackets: {pairs: "()[]{}`'\"\""},
    dontIndentStates: ['comment'],
    electricInput: /^\s*\}$/,
    blockCommentStart: '/*',
    blockCommentEnd: '*/',
    lineComment: '//',
    fold: 'brace'
  }
});

CodeMirror.defineMIME('text/x-stata', 'stata');
CodeMirror.defineMIME('text/stata', 'stata');
});
